/**
 * Copyright 2018-2019 jianggujin (www.jianggujin.com).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.jianggujin.modulelink.magager;

import java.util.Collection;
import java.util.List;
import java.util.Set;

import com.jianggujin.modulelink.config.JModuleConfig;
import com.jianggujin.modulelink.exception.JModuleNotFoundException;
import com.jianggujin.modulelink.loader.JModuleLoader;
import com.jianggujin.modulelink.module.JModule;
import com.jianggujin.modulelink.module.JModuleListener;
import com.jianggujin.modulelink.support.JBeanProvider;
import com.jianggujin.modulelink.support.plugin.JInterceptor;

/**
 * 模块管理器支持接口
 * 
 * @author jianggujin
 *
 */
public interface JModuleManagerSupport<T extends JModuleConfig> {
    /**
     * 获得模块加载器
     * 
     * @return
     */
    JModuleLoader<T> getModuleLoader();

    /**
     * 设置模块加载器
     * 
     * @param moduleLoader
     */
    void setModuleLoader(JModuleLoader<T> moduleLoader);

    /**
     * 获得指定名称的模块
     *
     * @param moduleName 模块名称
     * @return 模块
     * @throws JModuleNotFoundException 未找到Module异常
     */
    JModule<T> getModule(String moduleName);

    /**
     * 获得指定名称的模块
     *
     * @param moduleName 模块名称
     * @return 如果模块不存在则返回null
     */
    JModule<T> optModule(String moduleName);

    /**
     * 判断是否存在指定模块
     * 
     * @param moduleName 模块名称
     * @return 存在则返回true
     */
    boolean has(String moduleName);

    /**
     * 获得所有模块名称
     * 
     * @return 所有模块名称
     */
    Set<String> getModuleNames();

    /**
     * 获得所有模块
     * 
     * @return 所有模块
     */
    Collection<JModule<T>> getModules();

    /**
     * 添加模块监听器
     * 
     * @param moduleListener
     */
    void addModuleListener(JModuleListener moduleListener);

    /**
     * 设置模块监听器
     * 
     * @param moduleListeners
     */
    void setModuleListeners(List<JModuleListener> moduleListeners);

    /**
     * 获得拦截器
     * 
     * @return
     */
    List<JInterceptor> getInterceptors();

    /**
     * 添加拦截器
     * 
     * @param interceptor
     */
    void addInterceptor(JInterceptor interceptor);

    /**
     * 设置拦截器
     * 
     * @param moduleListeners
     */
    void setInterceptors(List<JInterceptor> interceptors);

    /**
     * 获得模块监听器
     * 
     * @return
     */
    List<JModuleListener> getModuleListeners();

    /**
     * Bean提供者服务
     * 
     * @return
     */
    JBeanProvider getBeanProvider();

    /**
     * 设置Bean提供者服务
     * 
     * @param beanProvider
     */
    void setBeanProvider(JBeanProvider beanProvider);

    /**
     * 卸载一个模块
     * 
     * @param moduleName 模块名称
     */
    void unload(String moduleName);

    /**
     * 卸载所有模块
     * 
     */
    void unload();

}
